package pzl.com.drawrelated.views;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * @author zl.peng
 * @version [1.0, 2016-11-24]
 *          <p/>
 *          surface是纵深排序(Z-ordered)的，这表明它总在自己所在窗口的后面。
 *          surfaceview提供了一个可见区域，只有在这个可见区域内 的surface部分内容才可见，可见区域外的部分不可见。
 *          surface的排版显示受到视图层级关系的影响，它的兄弟视图结点会在顶端显示。
 *          这意味者 surface的内容会被它的兄弟视图遮挡，这一特性可以用来放置遮盖物(overlays)(例如，文本和按钮等控件)。
 *          注意，如果surface上面 有透明控件，那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果，这会影响性能
 */
public class V_NetSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    private String TAG = "V_NetSurfaceView";

    private SurfaceHolder sfh;
    private boolean ThreadFlag;
    private int counter;
    private Canvas canvas;

    private Thread mThread ;

    public V_NetSurfaceView(Context context) {
        super(context);
    }

    public V_NetSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 通过SurfaceView获得SurfaceHolder对象
        sfh = this.getHolder();

        // 为SurfaceHolder添加回调结构SurfaceHolder.Callback
        sfh.addCallback(this);
        mThread =  new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                while (ThreadFlag) {

                    // 锁定画布，得到Canvas对象
                    canvas = sfh.lockCanvas();

                    // 设定Canvas对象的背景颜色
                    canvas.drawColor(Color.GREEN);

                    // 创建画笔
                    Paint p = new Paint();
                    // 设置画笔颜色
                    p.setColor(Color.RED);
                    // 设置文字大小
                    p.setTextSize(40);

                    // 创建一个Rect对象rect
                    // public Rect (int left, int top, int right, int bottom)
                    Rect rect = new Rect(100, 50, 400, 350);
                    // 在canvas上绘制rect
                    canvas.drawRect(rect, p);
                    // 在canvas上显示时间
                    // public void drawText (String text, float x, float y, Paint
                    // paint)
                    canvas.drawText("时间 = " + (counter++) + " 秒", 500, 200, p);
                    Log.e(TAG, "时间 = " + (counter++) + " 秒");
                    if (canvas != null) {
                        // 解除锁定，并提交修改内容，更新屏幕
                        sfh.unlockCanvasAndPost(canvas);
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }

        });
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                               int height) {
        // TODO Auto-generated method stub
        Log.i(TAG, "surfaceChanged");

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        Log.i(TAG, "surfaceCreated");
        counter = 0;
        ThreadFlag = true;
        mThread.start();

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        Log.i(TAG, "surfaceDestroyed");
        ThreadFlag = false;

    }

    /**
     * abstract Canvas lockCanvas(Rect dirty);
     锁定画布的某个区域进行画图等..因为画完图后，会调用下面的unlockCanvasAndPost来改变显示内容。
     相对部分内存要求比较高的游戏来说，可以不用重画dirty外的其它区域的像素，可以提高速度。
     */
}


